package com.demo.java.OD201_250.OD249;

import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【优秀员工统计】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146028304
 */
public class OdMain {
    static class Man implements Comparable<Man> {
        int id, count, start;

        public Man(int id, int count, int start) {
            this.id = id;
            this.count = count;
            this.start = start;
        }

        // 自定义排序规则
        @Override
        public int compareTo(Man other) {
            // 按照打卡次数排序，次数多的排前面
            return this.count != other.count ? other.count - this.count
                    // 如果次数相同，则按照最早打卡时间排序
                    : this.start != other.start ? this.start - other.start
                    // 如果打卡次数和打卡时间都相同，则按id排序
                    : this.id - other.id;
        }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 读取员工打卡的总数
        int n = Integer.parseInt(in.nextLine());
        PriorityQueue<Man> q = new PriorityQueue<>(); // 优先队列，用于排序
        Map<Integer, Man> m = new HashMap<>(); // 存储每个员工的打卡信息
        in.nextLine(); // 跳过空行
        AtomicInteger day = new AtomicInteger(); // 用来计算天数，表示打卡的顺序

        // 遍历30天的打卡记录
        while (day.incrementAndGet() <= 30)
            Arrays.stream(in.nextLine().split(" ")) // 读取每一天的打卡记录
                    .map(Integer::parseInt) // 将打卡id转换为整数
                    .forEach(i -> {
                        m.putIfAbsent(i, new Man(i, 0, -1)); // 如果该员工第一次打卡，则初始化
                        Man man = m.get(i); // 获取该员工的打卡记录
                        man.count++; // 打卡次数加1
                        man.start = man.start == -1 ? day.get() : man.start; // 如果是第一次打卡，记录下打卡的时间
                    });

        // 将所有员工的信息添加到队列中
        q.addAll(m.values());

        // 输出打卡次数最多的前5个员工
        for (int i = 0; i < 5 && !q.isEmpty(); i++)
            System.out.print(q.poll().id + " "); // 输出员工id
    }
}